//! 一个完整的网络数据包
//! 自定义协议，在 socket 接收数据后封装为一个完整的网络数据包，用于后续的数据处理
//! 
//! data_package.rs
//! 
//! (RUST) alone
//! 
//! Create time: 2025-08-19		alone
//! Update time: 2025-08-19		alone
//! 

use bytemuck::bytes_of;

use crate::net::{head::ProtocolHead, tcp_client::TcpClient};

/// 数据包
#[derive(Debug, Clone)]
pub struct DataPackage 
{
	/// 协议头
	pub head: ProtocolHead,
	/// 需要处理的数据
	pub data: Vec<u8>,
	/// 源
	pub socket: TcpClient,
}

impl DataPackage {
	/// 创建一个数据包
	pub fn new(mut head: ProtocolHead, data: Vec<u8>, socket: TcpClient) 
		-> Self 
	{
		head.len = data.len() as u32;
		Self 
		{ 
			head, 
			data,
			socket,
		}
	}

	pub fn to_bytes(&self) -> Vec<u8> 
	{
        let mut buffer = Vec::with_capacity(std::mem::size_of::<ProtocolHead>() + self.head.len as usize);
        
        // 安全转换 head 为 &[u8]
        buffer.extend_from_slice(bytes_of(&self.head));
        
        // 加入 data 内容
		if self.head.len != 0 
		{
			 buffer.extend_from_slice(&self.data);
		}
        
        buffer
    }
}